package com.rj.ability.leqi.adapter.domain.aisino;

import lombok.Data;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

/**
 * 差额征收清单
 *
 * @author YFX_RANLUBO
 * @date 2024/08/08 09:42
 **/
@Data
public class DictConvert {

    public static final String FPPZ = "fppz";
    public static final String TDYS = "tdys";
    public static final String ZRRBZ = "zrrbz";
    public static final String FPHXZ = "fphxz";
    public static final String LZFPBZ = "lzfpbz";
    public static final String CEZSLXDM = "cezslxdm";
    public static final String CKYWSYZCDM = "ckywsyzcdm";
    public static final String ZZSJZJTDM = "zzsjzjtdm";
    public static final String SFBZ = "sfbz";
    public static final String CHYYDM = "chyydm";
    public static final String LRFSF = "lrfsf";
    public static final String YHJSLX = "yhjslx";

    //默认空、”“对应值
    private static final String KEY_NONE = "None";

    private static final Map<String, Dict> dict = new HashMap<>();


    static {
        //标识自然人 Y：购买方是自然人N：购买方非自然人
        dict.put(ZRRBZ, new Dict("1", "N").put("3", "Y"));
        //发票行性质 0 正常行 1 折扣行,2 被折扣行>>00：正常行 01：折扣行 02：被折扣行
        dict.put(FPHXZ, new Dict("0", "00").put("1", "01").put("2", "02"));
        //发票票种 081 数字化电子专票 082 数字化电子普票>>01：数电专 02：数电普
        dict.put(FPPZ, new Dict("081", "01").put("082", "02"));
        //特定要素 00非特定要素 03：建筑服务 06：不动产租赁
        //01：成品油08*  03：建筑服务* 04：货物运输* 05：不动产销售* 06：不动产租赁* 07：代收车船税* 09：旅客运输18*
        // 12：农产品销售14* 16 农产品收购*
        // 10：医疗住院12 11：医疗门诊13 02：稀土01 17 光伏收购a02 32电子烟a32
        dict.put(TDYS, new Dict("00", "").put("01", "02").put("03", "03").put("04", "04")
            .put("05", "05").put("06", "06").put("07", "07").put("08", "01").put("12","10").put("13","11")
            .put("14", "12").put("16", "16").put("18", "09").put("32", "32").put("02", "17"));
        //蓝字发票标识 0：蓝字发票 1：红字发票
        dict.put(LZFPBZ, new Dict("0", "0").put("1", "1"));
        //征税类型代码 0：普通征税  2：差额征税—差额开票 3：差额征税—全额开票>>空：非差额发票 01：全额开票 02：差额开票
        dict.put(CEZSLXDM, new Dict("0", "").put("2", "01").put("3", "02"));
        //出口业务适用政策代码 00|空：非出口业务01：退税政策02：免税政策03：征税政策
        dict.put(CKYWSYZCDM, new Dict("00", "").put("01", "01").put("02", "02").put("03", "03").put(KEY_NONE, ""));
        //增值税即征即退代码  00|空：非增值税即征即退01：软件产品发票02：资源综合利用产品发票03：管道运输服务发票
        //     * 04：有形动产融资租赁服务05：有形动产融资性售后回租服务发票06：新型墙体材料发票
        //     * 07：风力发电产品发票08：光伏发电89产品发票09：动漫软件产品发票
        //     * 10：飞机维修劳务发票11：黄金发票12：铂金发票
        dict.put(ZZSJZJTDM, new Dict("00", "").put("01", "01").put("02", "02").put("03", "03")
            .put("04", "04").put("05", "05").put("06", "06").put("07", "07").put("08", "08")
            .put("09", "09").put("10", "10").put("11", "11").put("12", "12").put(KEY_NONE, ""));
        //标识Y,N
        dict.put(SFBZ, new Dict("Y", "Y").put("N", "N").put(KEY_NONE, ""));
        //    * 红字发票冲红原 1-销货退回； 2-开票有误；  3-服务中止； 4-销售折让 缺省2
        //               >> 01：开票有误 02：销货退回 03：服务中止04：销售折让
        dict.put(CHYYDM, new Dict("1", "02").put("2", "01").put("3", "03").put("4", "04")
            .put(KEY_NONE, "01"));

        //    * 红字发票冲红原 1-销货退回； 2-开票有误；  3-服务中止； 4-销售折让 缺省2
        //               >> 01：开票有误 02：销货退回 03：服务中止04：销售折让
        dict.put(CHYYDM, new Dict("1", "02").put("2", "01").put("3", "03").put("4", "04")
            .put(KEY_NONE, "01"));
        //2我是销方 1我是购方     >> 0：销方 1：购方
        dict.put(LRFSF, new Dict("1", "1").put("2", "0"));
        //1我是销方 2我是购方     >>  0：销方  1：购方
        dict.put(YHJSLX, new Dict("1", "0").put("2", "1"));
    }

    public static String get(String typeName, String key) {
        Dict type = dict.get(typeName);
        if (type == null) {
            throw new RuntimeException("字典不存在" + typeName);
        }

        String value = type.get(key);
        if (value == null) {
            throw new RuntimeException("字典{" + typeName + "}中key{" + key + "}不存在");
        }

        return value;
    }


    /**
     * 检查target对source照实体间属性对照是否一致
     *
     * @param source
     * @param target
     */
    public static void compareField(Class source, Class target) {
        Field[] declaredFields = target.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            declaredField.setAccessible(true);
            String name = declaredField.getName();
            try {
                source.getDeclaredField(name);
                System.out.println(name + "==" + name);
            } catch (Exception e) {
                System.out.println(name + "==" + null);
            }

        }

    }

    static class Dict {
        final Map<String, String> map = new HashMap();

        public Dict(String key, String value) {
            map.put(key, value);
        }

        public Dict put(String key, String value) {
            map.put(key, value);
            return this;
        }

        public String get(String key) {
            if (key == null || key.isEmpty()) {
                return map.get(KEY_NONE);
            }
            return map.get(key);
        }

    }

}
